package com.yuhs.zixing.study.design.pattern.dp001.principle.p02.interface_segregation;

/**
 * @description 分析 InterfaceSegregationDemo001
 * 1、类A 通过接口 InterfaceDemo001 依赖 类B，类C 通过接口 InterfaceDemo001 依赖 类D ，
 * 接口 InterfaceDemo001 对于 类 A、C 来说不是最小接口。那么类 B、D 必须实现他们不需要的接口。
 * 2、将 InterfaceDemo001 接口拆分为几个独立的接口，类 A、C 和他们需要的接口建立依赖关系，也就是采用接口隔离原则
 * 3、看实现
 * @author: yuhs
 * @date 2022/3/24 下午4:01
 */
public class InterfaceSegregationDemo002 {
    public static void main(String[] args) {
        A02 a02 = new A02();
        C02 c02 = new C02();
    }
}

interface InterfaceDemo002_01 {
    void operationA();
}

interface InterfaceDemo002_02 {
    void operationB();

    void operationC();
}

interface InterfaceDemo002_03 {

    void operationD();

    void operationE();
}

class B02 implements InterfaceDemo002_01, InterfaceDemo002_02 {

    @Override
    public void operationA() {
        System.out.println("B 实现了 operationA");
    }

    @Override
    public void operationB() {
        System.out.println("B 实现了 operationB");
    }

    @Override
    public void operationC() {
        System.out.println("B 实现了 operationC");
    }
}

class D02 implements InterfaceDemo002_01, InterfaceDemo002_03 {

    @Override
    public void operationA() {
        System.out.println("D 实现了 operationA");
    }

    @Override
    public void operationD() {
        System.out.println("D 实现了 operationD");
    }

    @Override
    public void operationE() {
        System.out.println("D 实现了 operationE");
    }
}

/**
 * A类通过接口 InterfaceDemo001 依赖（使用）B,但是只会用到A、B、C方法
 */
class A02 {

    public void dependA(B02 i) {
        i.operationA();
    }

    public void dependB(B02 i) {
        i.operationB();
    }

    public void dependC(B02 i) {
        i.operationC();
    }


}

/**
 * C类通过接口 InterfaceDemo001 依赖（使用）B,但是只会用到A、D、E方法
 */
class C02 {

    public void dependA(D02 i) {
        i.operationA();
    }

    public void dependD(D02 i) {
        i.operationD();
    }

    public void dependE(D02 i) {
        i.operationE();
    }
}
